class Solution {
    public boolean isSubtree(TreeNode root, TreeNode subRoot) {
        //如果递归到空，说明没有找到子树，返回false
        if(root == null) {
            return false;
        }
        //判断当前节点的整颗树和子树是否相同即可
        if(isSameTree(root,subRoot)) {
            return true;
        }
        //如果递归遇见了子树 则一路返回true
        if(isSubtree(root.left,subRoot)) return true;
        if(isSubtree(root.right,subRoot)) return true;
        //本次递归没有找见子树 返回false
        return false;
    }

    public boolean isSameTree(TreeNode p, TreeNode q) {
        // 1.先判断结构是否是一样的
        if (p != null && q == null || p == null && q != null) {
            return false;
        }
        // 上述if语句 如果没有执行，意味着两个引用 同时为空 或者同时不为空
        if (p == null && q == null) {
            return true;
        }
        // 都不为空 判断值是否一样
        if (p.val != q.val) {
            return false;
        }
        // 都不为空且值一样
        return isSameTree(p.left, q.left) && isSameTree(p.right, q.right);
    }
}